/*
 * @Author: 颜礼田 2564217790@qq.com
 * @Date: 2024-09-07 18:03:24
 * @LastEditors: MrDotYan 2564217790@qq.com
 * @LastEditTime: 2024-09-20 18:42:38
 * @FilePath: /webServer/src/utils/unique.ts
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */

import { TreeNode } from '../interface';

/**
 * * 通过数组对象属性去重
 * @param arr 数组对象
 * @param prop 属性key
 * @returns 去重后的数组
 */
export function uniqueByProps<T extends Record<string, any>>(
  arr: T[],
  prop: keyof T
): T[] {
  const map = new Map<T[keyof T], T>();

  for (const item of arr) {
    if (!map.has(item[prop])) {
      map.set(item[prop], item);
    }
  }

  return Array.from(map.values());
}

/**
 * 深拷贝
 * @param obj
 * @returns
 */
export function deepCopy(obj) {
  if (obj === null) return null; // Handle null case
  if (Array.isArray(obj)) {
    return obj.map(item => deepCopy(item));
  } else if (typeof obj === 'object') {
    const copy = Object.create(Object.getPrototypeOf(obj)); // Preserve prototype
    for (const key of Object.keys(obj)) {
      // Use Object.keys for better performance
      copy[key] = deepCopy(obj[key]);
    }
    return copy;
  }
  return obj; // 处理原始值
}

/**
 * 从树结构中查询第一个叶子元素
 * @param nodes
 * @returns
 */
export function findFirstLeafNode(nodes: TreeNode[]): TreeNode | null {
  for (const node of nodes) {
    // 如果没有子节点，说明是叶子节点
    if (!node.children) {
      return node; // 找到第一个叶子节点
    }
    // 递归查找子节点
    const leafNode = findFirstLeafNode(node.children);
    if (leafNode) {
      return leafNode; // 如果在子节点中找到叶子节点
    }
  }
  return null; // 如果没有找到叶子节点
}

/**
 * 生成指定长度的随机字符串
 *
 * @param length 字符串的长度，由调用者指定
 * @returns 返回一个包含指定数量随机字符的字符串
 *
 * 此函数通过循环从一个预定义的字符集中随机选择字符来生成字符串
 * 这种方法确保了生成的字符串是随机的，可以用于需要临时标识符或密钥的场景
 */
export function generateRandomString(length: number) {
  // 初始化结果字符串
  let result = '';
  // 定义可选字符集，包含大小写字母和数字
  const characters =
    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  // 获取字符集长度
  const charactersLength = characters.length;
  // 循环生成随机字符，直到达到指定长度
  for (let i = 0; i < length; i++) {
    // 从字符集中随机选择一个字符并添加到结果字符串中
    result += characters.charAt(Math.floor(Math.random() * charactersLength));
  }
  // 返回生成的随机字符串
  return result;
}

/**
 * json转为json字符串
 * @param json
 * @returns
 */
export function jsonStringify(json: any): string {
  try {
    return JSON.stringify(json);
  } catch (error) {
    console.error('Error during JSON.stringify:', error);
    return '';
  }
}

/**
 * json字符串转json
 * @param str
 * @returns
 */
export function jsonStringify2json(str: string): any {
  try {
    return JSON.parse(str);
  } catch (error) {
    console.error('Error during JSON.parse:', error);
    throw new Error(`Invalid JSON format: ${error.message}`);
  }
}
